package FirstStage.DuoTai;

public class Poly {
    public static void main(String[] args) {
        Master tom = new Master("汤姆");
        Dog dog = new Dog("大黄");
        Bone bone = new Bone("大棒骨");
        tom.feed(dog,bone);
        // 方法重载体现多态
        Cat cat = new Cat("小花猫");
        Fish fish = new Fish("金枪鱼");
        tom.feed(cat,fish);
        System.out.println("------------------------------------");
        // 对象多态： (1) 一个对象的编译类型和运行类型可以不一致，例如 Animal animal = new Dog();
        // (2) 编译类型在定义对象时就确定了，不能改变
        // (3) 运行类型是可以变化的
        // (4) 编译类型看定义时 = 的左边，运行类型看 = 的右边
        Animal animal = new Dog();
        animal.cry();
        animal = new Cat(); // 运行类型可以变化，编译类型仍然是Animal
        animal.cry();
        // 注意： 多态的前提是，两个对象存在继承关系
        // 多态的本质是：父类的引用指向了子类的对象
        // 语法： 父类类型 引用名 = new 子类类型（）;
        // 特点： 编译类型看左边，运行类型看右边，可以调用父类中的所有成员（需遵循访问权限），不能调用子类中特有成员
        //animal.catchmouse(); 报错,因为在编译阶段（所谓编译阶段，就是写代码的时候），能调用哪些成员，是由编译类型决定的
        // 最终运行结果看子类的具体实现：程序运行的时候，看的是子类类型。
        animal.cry(); // 运行的是子类的cry(),如果子类没有cry(),则向上往父类查找调用
        System.out.println("------------------------------------");
        // 如果就是想调用子类中的特有成员，可以使用多态的向下转型，转型后可以调用子类类型中的所有成员
        // 语法： 子类类型 引用名 = （子类类型）父类引用
        // 注意： 只能强转父类的引用，不能强转父类的对象
        Cat cat1 = (Cat) animal;
        cat1.catchmouse();// 此时cat1的编译类型是Cat，运行类型也是Cat
        // 要求父类的引用（animal）必须指向的是当前目标类型（Cat）的对象
        //Dog dog1 = (Dog) animal; 此时运行会报错，因为animal原本指向的是Cat类型的对象，而当前目标类型是Dog
        System.out.println("------------------------------------");
        // 属性没有重写的说法，属性的值看编译类型
        Animal animal1 = new Cat();
        System.out.println(animal1.count);
        System.out.println("------------------------------------");
        // instanceof操作符: 对象 instanceof 类型,判断对象的 ！运行类型！ 是否是XX类型或者XX类型的子类型
        Cat cat2 = new Cat();
        System.out.println(cat2 instanceof Cat);
        System.out.println(cat2 instanceof Animal);

        Animal animal2 = new Cat();
        System.out.println(animal2 instanceof Animal);
        System.out.println(animal2 instanceof Cat);
    }
}
